function fn(){... reutrn ..;}
var fn_1 = function {... reutrn ..;}
使用(2)方式,因為hoisted的關係,
var fn_1
會往上提昇,但給定的function{..}還是在原處。所以如果在這之前呼叫function會參考不到而發生錯誤。使用(1)的方式是整個hoisted,也應為提昇的關係可以在原處之前呼叫也沒有問題。
若function裡無return值,則function執行完畢回覆給呼叫者會是undefined。
定義function可出現在程式碼的任何地方,但不能出現在迴圈裡(for,while,...)。
方法有四種
function test(v){...}
test(1);
var t = test(5);
物件(object)裡的property中的函式。
var obj={x:1}
obj.fn= function(){...}
ojb.fn(); // invoke fn
var obj={
x:1,
y:2,
add: function(){
this.result= this.x + this.y;
}
}
obj.add(); // obj["add"]()
obj.result; // return 3
obj.add()
物件本身會多一個result的property。this關鍵字:
如果是物件裡方法(method)中使用,則作用域會是物件內部。
如果是在函示(function)直接使用則this指向的是global(非strict)或undefined(strict)
var x= 5;
function fn_1(){
return this.x; // 指的是global的x
}
var obj={
x:2,
obj_fn: function(){
return this.x; // 指的是obj裡的x
}
}
fn_1(); // 5
obj.obj_fn; // 2
如果在使用function或method前面加上了new,那就構成了invoke建構式。通常不使用return關鍵字。
var obj = new Object();
var obj = new Object; // 若無參數傳入最後的()可省略。
會在Day9詳述。
在Javascript裡,並不會對傳入的參數作任何型別的檢查。function fn(參數){}
fn(引數)
選擇性參數需放在function帶入參數的最後。
當呼叫者傳入的引數少於function參數的數量,額外的部分會被設為undefined。
function fn(v1,v2){
if(v2 === undefined) v2 =[];
for(var p in v1){
v2.push(p);
}
return v2;
}
當呼叫者傳入的引數多餘function參數,在function無法參告到這些不具名的值(直接忽略),arguments物件可以解決這個問題。
function fn(x,y,z){
if(arguments.length != 3) {
return thorw Error("Argumets length Error")
}
}
fn(1,2,3,4)
function max(){
var max = Number.NEGATIVE_INFINITY;
for(var i=0; i < arguments.length; i++){
if(arguments[i] > max) max = arguments[i];
}
return max
}
// 取最大值
max(1,10,5,255,1000) // return 1000
arguments並非真的陣列,是種類陣列物件(array-line object),可想像成具有編號的陣列元素且有length方法。
ES5 strict下,arguments不能使用。
在非strict下,Arguments物件使用callee特性可以取得目前正在執行的function,使用caller可查看call stack
有些情況我們需要存取上次計算的值帶入fuction,大部分的情況會使用global變數存取。這有另一方式,直接存取在function的property中。
var value=0;
function sum(n){
value += n;
}
sum(5); // value= 5
sum(2); // value= 7
function sum(n){
sum.value += n
}
sum.value = 0 ; // 初始化
sum(5);
sum(2); // sum.value=7 ,sum["value"]=7